package cn.edu.lcu.cs.javaprogramming.thread;

/**
 * 递增线程
 *
 * @author ling
 * @date 2022/5/31 23:19
 */
public class IncrementThread {
    private static int count = 0;

    public static void main(String[] args) throws InterruptedException {
        // 创建新线程，构造参数是Runnable接口的实现类
        // 以方法引用的形式创建了一个 Runnable接口实现类
        // 线程的主方法run()引用了 IncrementThread::increment
        Thread thread1 = new Thread(IncrementThread::increment);
        Thread thread2 = new Thread(IncrementThread::increment);

        thread1.start();
        thread2.start();

        // 主线程允许线程1插队，即等到插队的线程执行结束，本线程（本例为主线程）再执行。
        // 线程1，累加1000次
        thread1.join();
        // 线程2，累加1000次
        thread2.join();

        // 两个线程各累加1000次，结果应该是2000
        // 但结果却不确定
        System.out.println("count = " + count);

    }

    /**
     * 累加1000次
     */
    private static void increment() {
        // 在多线程环境中，可能多个线程同时写count，造成数据不一致。
        // 这是线程不安全的代码
        for (int i = 0; i < 1000; i++) {
            count++;
        }
    }
}
